package ConnectivityEditor.Window; import java.util.ArrayList; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.events.MouseWheelListener; import BrickControlGuide.IGuideRenderer; import BrickControlGuide.RotationGuide; import Builder.BuilderConfigurationManager; import Builder.BrickSelectionManager; import Builder.MainCamera; import Command.LDrawPart; import Common.Matrix4; import Common.Vector2f; import Common.Vector3f; import Connectivity.CollisionBox; import Connectivity.Connectivity; import Connectivity.Direction6T; import Connectivity.IConnectivity; import Connectivity.ICustom2DField; import Connectivity.MatrixItem; import ConnectivityEditor.Connectivity.ConnectivityRendererForConnectivityEditor; import ConnectivityEditor.ConnectivityControlGuide.ConnectivityMovementGuideRenderer; import ConnectivityEditor.UndoRedo.AddNDeleteConnAction; import ConnectivityEditor.UndoRedo.ConnectivityEditorUndoRedoManager; import ConnectivityEditor.UndoRedo.MoveConnectivityAction; import LDraw.Support.type.LDrawGridTypeT; import Notification.LDrawDirectiveModified; import Notification.NotificationCenter; import Notification.NotificationMessageT; import UndoRedo.LDrawUndoRedoManager; import UndoRedo.MovePartsAction; public class ConnectivityEditorEventHandler implements MouseListener, MouseTrackListener, MouseMoveListener, MouseWheelListener, KeyListener { @Override public void mouseScrolled(MouseEvent e) { camera.zoom(e); } ConnectivitySelectionManager selectionManager; @Override public void mouseMove(MouseEvent e) { GlobalMousePositionForConnectivityEditor.getInstance().setPos(e.x, e.y); if (isLeftPressed) { isLeftDragged = true; } if (isRightPressed) { isRightDragged = true; } handleMouseDragged(e); } @Override public void mouseDoubleClick(MouseEvent e) { } private void handleMouseWheelButtonDoubleClick(MouseEvent e) { } @Override public void mouseDown(MouseEvent e) { if (e.button == 1) { // left button pressed isLeftPressed = true; handleMouseLeftButtonPressed(e); } else if (e.button == 3) { // right button // pressed isRightPressed = true; handleMouseRightButtonPressed(e); } } @Override public void mouseUp(MouseEvent e) { if (e.button == 1) { // left button released isLeftPressed = false; if (isLeftDragged == false) {// mouse clicked. handleMouseLeftButtonClicked(e); } else { handleMouseLeftButtonReleased(e); isLeftDragged = false; } } else if (e.button == 2) { handleMouseWheelButtonDoubleClick(e); } else if (e.button == 3) { // Right Button // released isRightPressed = false; if (isRightDragged == false) {// mouse clicked. handleMouseRightButtonClicked(e); } else { handleMouseRightButtonReleased(e); isRightDragged = false; } } connectivityMovementGuideRenderer.axisSelectedType(null); } @Override public void mouseEnter(MouseEvent e) { // GLCanvas canvas = ((GLCanvas) e.widget); // canvas.setFocus(); } @Override public void mouseExit(MouseEvent e) { GlobalMousePositionForConnectivityEditor.getInstance().setPos(400, 400); } @Override public void mouseHover(MouseEvent e) { } private MainCamera camera = null; private ConnectivityMovementGuideRenderer connectivityMovementGuideRenderer; private ConnectivityRendererForConnectivityEditor connectivityRenderer; private Vector3f startMoveWorldPos = null; private Vector3f startMoveConnPos = null; private IConnectivity startMoveConn = null; private Vector2f startMoveMousePos = null; private boolean isLeftPressed = false; private boolean isLeftDragged = false; private boolean isRightPressed = false; private boolean isRightDragged = false; public ConnectivityEditorEventHandler(ConnectivityEditor editor) { camera = editor.getCamera(); connectivityMovementGuideRenderer = editor .getConnMovementGuideRenderer(); connectivityRenderer = editor.getConnectivityRenderer(); selectionManager = ConnectivitySelectionManager.getInstance(); } private void handleMouseDragged(MouseEvent e) { // System.out.println("handleMouseDragged"); // Right button pressed if (isRightPressed) { camera.rotate(e.x, e.y); } if (isLeftPressed) { switch (ConnectivityControlModeT.currentControlMode) { case None: ConnectivityControlModeT.currentControlMode = ConnectivityControlModeT.ConnectivitySelectingDrag; case ConnectivitySelectingDrag: break; case ConnectivityControl_Direct: { if (startMoveWorldPos == null || startMoveConn == null) { return; } Vector3f currentMoveWorldPos = ConnectivityEditor.getInstance() .getHittedPos(e.x, e.y, false); startMoveWorldPos = LDrawGridTypeT.getSnappedPos( startMoveWorldPos, LDrawGridTypeT.Fine); currentMoveWorldPos = LDrawGridTypeT.getSnappedPos( currentMoveWorldPos, LDrawGridTypeT.Fine); if (currentMoveWorldPos == null) return; Vector3f moveBy = currentMoveWorldPos.sub(startMoveWorldPos); if (moveBy.length() > 0) { startMoveConn.moveBy(moveBy); selectionManager.moveSelectedConnectivityBy(startMoveConn .getConnectivity()); startMoveWorldPos = currentMoveWorldPos; } } break; case ConnectivityControl_Guide: if (startMoveWorldPos == null) return; Vector3f currentMoveWorldPos = camera.screenToWorldXZ(e.x, e.y, 0); if (currentMoveWorldPos == null) return; Vector2f directionForX = null; Vector2f directionForZ = null; Vector2f directionForY = null; Vector2f temp = camera.getWorldToScreenPos(new Vector3f(), false); Vector2f tempY = camera.getWorldToScreenPos(new Vector3f(0, -1, 0), false); Vector2f tempX = camera.getWorldToScreenPos(new Vector3f(1, 0, 0), false); Vector2f tempZ = camera.getWorldToScreenPos(new Vector3f(0, 0, 1), false); if (temp != null && tempX != null) { directionForX = temp.sub(tempX); directionForX.scale(1 / directionForX.length()); } if (temp != null && tempY != null) { directionForY = temp.sub(tempY); directionForY.scale(1 / directionForY.length()); } if (temp != null && tempZ != null) { directionForZ = temp.sub(tempZ); directionForZ.scale(1 / directionForZ.length()); } // System.out.println(movedByY); Vector3f moveByInWorld = new Vector3f(); moveByInWorld.y = directionForY.getY() * (startMoveMousePos.getY() - e.y); moveByInWorld.x = directionForX.getX() * (startMoveMousePos.getX() - e.x) - directionForX.getY() * (startMoveMousePos.getY() - e.y); moveByInWorld.z = directionForZ.getX() * (startMoveMousePos.getX() - e.x) - directionForZ.getY() * (startMoveMousePos.getY() - e.y); moveByInWorld = moveByInWorld.scale(0.5f); IGuideRenderer selectedGuide = connectivityMovementGuideRenderer .getSelectedGuide(); if (selectedGuide != null) { boolean isRotation = false; if (selectedGuide instanceof RotationGuide) isRotation = true; Vector3f guideDirection = new Vector3f( selectedGuide.getAxisDirectionVector()); float projectedDistance = moveByInWorld.dot(guideDirection); moveByInWorld = guideDirection.scale(projectedDistance); // moveByInWorld.round(); if (isRotation) { projectedDistance = Math.abs(projectedDistance); connectivityMovementGuideRenderer.getConn().rotateBy( projectedDistance / 10, moveByInWorld); selectionManager .moveSelectedConnectivityBy(connectivityMovementGuideRenderer .getConn().getConnectivity()); } else { float scale = camera.getScreenToWorldDistance(1)*2; moveByInWorld = guideDirection.scale(projectedDistance); moveByInWorld = moveByInWorld.scale(scale); moveByInWorld.round(); connectivityMovementGuideRenderer.getConn().moveTo( new Vector3f(connectivityMovementGuideRenderer .getConn().getCurrentPos()) .add(moveByInWorld)); selectionManager .moveSelectedConnectivityBy(connectivityMovementGuideRenderer .getConn().getConnectivity()); } startMoveWorldPos = currentMoveWorldPos; startMoveMousePos = new Vector2f(e.x, e.y); } break; default: break; } } } private void handleMouseRightButtonPressed(MouseEvent e) { // System.out.println("handleMouseRightButtonPressed"); camera.startRotate(e.x, e.y); } private void handleMouseLeftButtonPressed(MouseEvent e) { IConnectivity pointingConn = connectivityRenderer .getHittedConnectivity(camera, e.x, e.y); switch (ConnectivityControlModeT.currentControlMode) { case None: case ConnectivityControl: case ConnectivityControl_Direct: case ConnectivityControl_Guide: startMoveMousePos = new Vector2f(e.x, e.y); // is Pointing a brick startMoveConn = pointingConn; // isPointing a guide mark IGuideRenderer selectedAxisGuide = connectivityMovementGuideRenderer .getHittedAxisArrow(e.x, e.y); connectivityMovementGuideRenderer .axisSelectedType(selectedAxisGuide); if (selectedAxisGuide != null) {// guiding mark is // pressed startMoveWorldPos = camera.screenToWorldXZ(e.x, e.y, 0); startMoveWorldPos.y = camera.screenToWorldXY(e.x, e.y, 0).y; ConnectivityControlModeT.currentControlMode = ConnectivityControlModeT.ConnectivityControl_Guide; } else if (startMoveConn != null) {// a brick is pointing // init startPos to Move Brick ConnectivityControlModeT.currentControlMode = ConnectivityControlModeT.ConnectivityControl_Direct; startMoveWorldPos = connectivityRenderer.getHittedPos(camera, e.x, e.y); Connectivity conn = pointingConn.getConnectivity(); if (selectionManager.containsInSelection(conn) == false) { selectionManager.addConnectivityToSelection(conn); } } else if (pointingConn == null) { ConnectivityControlModeT.currentControlMode = ConnectivityControlModeT.None; } break; default: break; } } private void handleMouseLeftButtonClicked(MouseEvent e) { IConnectivity conn = ConnectivityEditor.getInstance() .getConnectivityRenderer() .getHittedConnectivity(camera, e.x, e.y); handleBrickControlGuideDisplay(conn); if (conn != null) { selectionManager.addConnectivityToSelection(conn.getConnectivity()); } else { selectionManager.clearSelection(); } } private void handleMouseRightButtonReleased(MouseEvent e) { } private void handleMouseLeftButtonReleased(MouseEvent e) { switch (ConnectivityControlModeT.currentControlMode) { case None: break; case ConnectivityControl: case ConnectivityControl_Direct: case ConnectivityControl_Guide: handleConnectivityMove(); break; default: break; } startMoveConn = null; ConnectivityControlModeT.currentControlMode = ConnectivityControlModeT.None; } private void handleBrickControlGuideDisplay(IConnectivity conn) { connectivityMovementGuideRenderer.setConn(conn); } private void handleMouseRightButtonClicked(MouseEvent e) { } private boolean isShiftKeyPressed = false; private boolean isCtrlKeyPressed = false; private boolean isAltKeyPressed = false; ArrayList<LDrawPart> instructionSequence = null; int indexForTest = 0; @Override public void keyPressed(KeyEvent event) { switch (event.keyCode) { case SWT.ESC: isAltKeyPressed = isCtrlKeyPressed = isShiftKeyPressed = false; ConnectivitySelectionManager.getInstance().clearSelection(); break; case SWT.CONTROL: isCtrlKeyPressed = true; break; case SWT.SHIFT: isShiftKeyPressed = true; break; case SWT.ALT: isAltKeyPressed = true; break; case SWT.DEL: AddNDeleteConnAction action = new AddNDeleteConnAction(); LDrawPart part = ConnectivityEditor.getInstance().getWorkingPart(); if (part == null) return; for (Connectivity conn : selectionManager .getSelectedConnectivityList()) { action.removeConnectivity(conn); if (conn instanceof CollisionBox) part.getCollisionBoxList().remove(conn.getConnectivity()); else part.getConnectivityList().remove(conn.getConnectivity()); } handleBrickControlGuideDisplay(null); ConnectivityEditorUndoRedoManager.getInstance().pushUndoAction( action); break; case SWT.ARROW_RIGHT: if (isCtrlKeyPressed == false) { if (isShiftKeyPressed && isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 5, 0)); else if (isShiftKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 45, 0)); else if (isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 15, 0)); else handleRotateSelectedConnectivity(new Vector3f(0, 90, 0)); } else { if (isShiftKeyPressed == false && isAltKeyPressed == false) { handleMoveSelectedConnectivity(Direction6T.X_Plus); } } break; case SWT.ARROW_LEFT: if (isCtrlKeyPressed == false) { if (isShiftKeyPressed && isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, -5, 0)); else if (isShiftKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, -45, 0)); else if (isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, -15, 0)); else handleRotateSelectedConnectivity(new Vector3f(0, -90, 0)); } else { if (isShiftKeyPressed == false && isAltKeyPressed == false) { handleMoveSelectedConnectivity(Direction6T.X_Minus); } } break; case SWT.ARROW_UP: if (isCtrlKeyPressed == false) { if (isShiftKeyPressed && isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(5, 0, 0)); else if (isShiftKeyPressed) handleRotateSelectedConnectivity(new Vector3f(45, 0, 0)); else if (isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(15, 0, 0)); else handleRotateSelectedConnectivity(new Vector3f(90, 0, 0)); } else { if (isShiftKeyPressed == false && isAltKeyPressed == false) { handleMoveSelectedConnectivity(Direction6T.Z_Plus); } } break; case SWT.ARROW_DOWN: if (isCtrlKeyPressed == false) { if (isShiftKeyPressed && isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(-5, 0, 0)); else if (isShiftKeyPressed) handleRotateSelectedConnectivity(new Vector3f(-45, 0, 0)); else if (isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(-15, 0, 0)); else handleRotateSelectedConnectivity(new Vector3f(-90, 0, 0)); } else { if (isShiftKeyPressed == false && isAltKeyPressed == false) { handleMoveSelectedConnectivity(Direction6T.Z_Minus); } } break; case SWT.PAGE_UP: if (isCtrlKeyPressed == false) { if (isShiftKeyPressed && isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 0, 5)); else if (isShiftKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 0, 45)); else if (isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 0, 15)); else handleRotateSelectedConnectivity(new Vector3f(0, 0, 90)); } else { if (isShiftKeyPressed == false && isAltKeyPressed == false) { handleMoveSelectedConnectivity(Direction6T.Y_Minus); } } break; case SWT.PAGE_DOWN: if (isCtrlKeyPressed == false) { if (isShiftKeyPressed && isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 0, -5)); else if (isShiftKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 0, -45)); else if (isAltKeyPressed) handleRotateSelectedConnectivity(new Vector3f(0, 0, -15)); else handleRotateSelectedConnectivity(new Vector3f(0, 0, -90)); } else { if (isShiftKeyPressed == false && isAltKeyPressed == false) { handleMoveSelectedConnectivity(Direction6T.Y_Plus); } } break; case 'y': if (isCtrlKeyPressed) ConnectivityEditorUndoRedoManager.getInstance().redo(); break; case 'z': if (isCtrlKeyPressed) ConnectivityEditorUndoRedoManager.getInstance().undo(); break; default: } } private void handleRotateSelectedConnectivity(Vector3f rotationVector) { if (connectivityMovementGuideRenderer.getConn() != null) { connectivityMovementGuideRenderer.getConn().rotateBy( (float) Math.toRadians(rotationVector.length()), rotationVector.scale(1 / rotationVector.length())); selectionManager .moveSelectedConnectivityBy(connectivityMovementGuideRenderer .getConn().getConnectivity()); handleConnectivityMove(); } else if (selectionManager.isEmpty() == false) { selectionManager .getSelectedConnectivityList() .get(0) .rotateBy((float) Math.toRadians(rotationVector.length()), rotationVector.scale(1 / rotationVector.length())); selectionManager.moveSelectedConnectivityBy(selectionManager .getSelectedConnectivityList().get(0)); handleConnectivityMove(); } } @Override public void keyReleased(KeyEvent event) { switch (event.keyCode) { case SWT.SHIFT: isShiftKeyPressed = false; break; case SWT.CONTROL: isCtrlKeyPressed = false; break; case SWT.ALT: isAltKeyPressed = false; break; } } public void handleConnectivityMove() { MoveConnectivityAction action = new MoveConnectivityAction(); Matrix4 originalMatrix; ArrayList<Connectivity> connList = selectionManager .getSelectedConnectivityList(); for (Connectivity conn : connList) { originalMatrix = selectionManager .getInitialMoveTransformMatrix(conn); action.addMoveConnectivity(conn, originalMatrix, conn.getTransformMatrix()); } ConnectivityEditorUndoRedoManager.getInstance().pushUndoAction(action); } private void handleMoveSelectedConnectivity(Direction6T direction) { if (selectionManager.isEmpty()) return; Connectivity conn = selectionManager.getSelectedConnectivityList().get( 0); Vector3f moveByInWorld = null; switch (direction) { case X_Minus: moveByInWorld = new Vector3f(-1, 0, 0) .scale(BuilderConfigurationManager.getInstance() .getGridUnit().getXZValue()); break; case X_Plus: moveByInWorld = new Vector3f(1, 0, 0) .scale(BuilderConfigurationManager.getInstance() .getGridUnit().getXZValue()); break; case Y_Minus: moveByInWorld = new Vector3f(0, -1, 0) .scale(BuilderConfigurationManager.getInstance() .getGridUnit().getYValue()); break; case Y_Plus: moveByInWorld = new Vector3f(0, 1, 0) .scale(BuilderConfigurationManager.getInstance() .getGridUnit().getYValue()); break; case Z_Minus: moveByInWorld = new Vector3f(0, 0, -1) .scale(BuilderConfigurationManager.getInstance() .getGridUnit().getXZValue()); break; case Z_Plus: moveByInWorld = new Vector3f(0, 0, 1) .scale(BuilderConfigurationManager.getInstance() .getGridUnit().getXZValue()); break; } conn.moveBy(moveByInWorld); selectionManager.moveSelectedConnectivityBy(conn); handleConnectivityMove(); } }